/**************************************************************************//**
 * @item     CosyOS Config
 * @file     syscfg.h
 * @brief    OS Config File
 * @author   迟凯峰
 * @version  V2.3.1
 * @date     2023.05.07
 ******************************************************************************/

#ifndef __SYSCFG_H
#define __SYSCFG_H
#include "..\System\sysdef.h"

///////////////////////////////////////////////////////////////////////////////

          //*** <<< Use Configuration Wizard in Context Menu >>> ***//

///////////////////////////////////////////////////////////////////////////////
// <h> 系统设置
// <i> 系统设置

// <o> MCU内核
// <0=> 8051 <1=> 80251 <2=> Cortex-M
// <i> 告知CosyOS您的MCU内核，CosyOS将自动包含相匹配的MCU配置文件。
#define __SYSCFG_MCUCORE                 1
#if   __SYSCFG_MCUCORE == 0
#define SYSCFG_MCUCORE                   8051
#elif __SYSCFG_MCUCORE == 1
#define SYSCFG_MCUCORE                   80251
#elif __SYSCFG_MCUCORE == 2
#define SYSCFG_MCUCORE                   cmx
#endif

// <o> 系统滴答周期
// <i> 取值范围：<1-1000000us>
// <i> 定义系统滴答定时器的溢出时间，一般取值1000us具有更加广泛的适用性。
// <i> 可开启系统滴答时间统计功能，您的设定值应远大于统计值。
#define SYSCFG_STKCYCLE                  1000
#if SYSCFG_STKCYCLE < 1 || SYSCFG_STKCYCLE > 1000000
#error 非法的设置值！
#endif

// <h> 临界区设置
// <i> 临界区设置

// <q> 任务临界区嵌套
// <i> 任务临界区保护是否支持嵌套功能？
// <i> 如果您能把控好所有临界区中的代码，确保不会嵌套，可关闭此功能以提高性能。
#define SYSCFG_TASKCRITICAL              1

// <q> 全局临界区嵌套
// <i> 全局临界区保护是否支持嵌套功能？
// <i> 如果您能把控好所有临界区中的代码，确保不会嵌套，可关闭此功能以提高性能。
#define SYSCFG_GLOBALCRITICAL            1

// </h>

// </h>
///////////////////////////////////////////////////////////////////////////////
// <h> 编译器设置
// <i> 编译器设置

// <o> 编译模式
// <0=> C89模式 <1=> C99模式
// <i> 告知CosyOS您所采用的编译模式，CosyOS将为您适配相匹配的服务和API，因为有些服务和API，在不同编译模式下有所不同。
// <i> 如果您的编译模式高于C99，请选择C99。
#define SYSCFG_COMPILEMODE               0

// <q> GNU扩展
// <i> 告知CosyOS您是否启用GNU扩展？仅是告知，若要启用还必须配置编译器的相关选项。
// <i> 如果编译器支持GNU扩展，建议您还是启用，因为这会使一部分服务和API更为人性化、智能化。
// <i> 如果您的MCU内核为ARM，则必须启用GNU扩展，否则CosyOS将无法正常运行。
#define SYSCFG_GNUEXT                    0
#if __SYSCFG_MCUCORE == 2 && !SYSCFG_GNUEXT
#error GNU扩展未启用，ARM内核必须启用GNU扩展！
#endif

// <o> 空操作
// <0=> _nop_() <1=> __NOP() <2=> nop() <3=> __nop() <4=> nop__() <5=> NOP() <6=> _NOP_() <7=> NOP__()
// <i> 不同的编译器，C语言空操作代码可能有所不同，您应配置正确的选项。
// <i> 如选项中没有，您可在文本编辑界面自行添加或定义。
#define __SYSCFG_NOP                     0
#if   __SYSCFG_NOP == 0
#define SYSCFG_NOP                       _nop_()
#elif __SYSCFG_NOP == 1
#define SYSCFG_NOP                       __NOP()
#elif __SYSCFG_NOP == 2
#define SYSCFG_NOP                       nop()
#elif __SYSCFG_NOP == 3
#define SYSCFG_NOP                       __nop()
#elif __SYSCFG_NOP == 4
#define SYSCFG_NOP                       nop__()
#elif __SYSCFG_NOP == 5
#define SYSCFG_NOP                       NOP()
#elif __SYSCFG_NOP == 6
#define SYSCFG_NOP                       _NOP_()
#elif __SYSCFG_NOP == 7
#define SYSCFG_NOP                       NOP__()
#endif

// </h>
///////////////////////////////////////////////////////////////////////////////
// <h> DEBUG接口设置
// <i> DEBUG接口是您与命令行和任务管理器通讯的专用接口，您应为它专门配置一个串口。

// <q> 任务PC监控
// <i> 是否启用任务PC监控？
// <i> 当任务管理器被调度运行时，被切换的任务入栈的PC值。
// <i> 当有任务出现代码运行卡死或死循环时，此功能可用来帮助用户锁定具体位置，以便查找BUG。注意，PC值为下一条汇编指令的地址。
// <i> 某任务出现代码运行卡死或死循环的表现：
// <i> 任务始终为就绪状态，且占用较高的CPU使用率，比它优先级低的任务一直都没有机会运行。
#define SYSCFG_TASKPCMONITOR             1

// <q> 系统滴答时间统计
// <i> 是否启用系统滴答时间统计？
// <i> 统计SysTick_Handler/定时器0中断，在每个系统滴答周期运行时间的平均值。
#define SYSCFG_STKTIMECOUNT              1

// <q> 开机自动启动任务管理器
// <i> 设备开机后，是否自动启动任务管理器？
#define SYSCFG_TASKMGRAUTOSTART          1

// <o> 任务管理器默认更新速度
// <500=> 快速（500毫秒）<1000=> 中速（1秒）<2000=> 慢速（2秒）
// <i> 任务管理器默认更新速度
#define SYSCFG_TASKMGRUPSPEED            1000

// <o> 串口发送使能
// <i> 定义DEBUG接口的串口发送使能，此项您应在文本编辑界面中定义。
// <i> 示例：
// <i> 8051/251-UART1：TI = 1
// <i> STM32 - USART1：USART_ITConfig(USART1, USART_IT_TXE, ENABLE)
#define SYSCFG_DEBUGSEND                 TI = 1

// </h>
///////////////////////////////////////////////////////////////////////////////
// <h> 任务设置
// <i> 任务设置

// <o> 任务创建模式
// <0=> 静态创建模式 <1=> 平衡创建模式 <2=> 动态创建模式
// <i> 静态创建模式：任务节点和任务栈均为静态，拥有卓越性能并且安全可信。
// <i> 动态创建模式：任务节点和任务栈均为动态，可显著的减少静态内存占用。
// <i> 平衡创建模式：任务节点为静态，任务栈为动态，各方面均介于两者之间。
#define SYSCFG_TASKCREATEMODE            1

// <o> 任务优先级分组
// <8=> 8级 <16=> 16级 <32=> 32级 <64=> 64级 <128=> 128级 <256=> 256级
// <i> 共有六个分组可供选择，8级、16级、32级、64级、128级、256级。
// <i> 如您配置的分组为8级，则最高优先级为7级，最低优先级为0级；如您配置的分组为256级，则最高优先级为255级，最低优先级为0级。
#define SYSCFG_TASKPRIORITY              256

// <h> 时间片模式
// <i> 时间片模式分为全局时间片、算法时间片、自定义时间片，您只能选其一。
// <i> 全局时间片，所有任务采用统一的时间片。
// <i> 算法时间片，不同优先级的时间片不同，采用一个算法公式来描述。
// <i> 自定义时间片，不同优先级的时间片不同，用户自定义各优先级的时间片。
// <i> 时间片的取值范围：<1-65535>，单位为滴答周期。

// <e> 全局时间片
// <i> 是否启用全局时间片？
#define __SYSCFG_GLOBALTIMESHARING       1
// <o> 全局时间片
// <i> 全局时间片
#define SYSCFG_GLOBALTIMESHARING         100
// </e>

// <e> 算法时间片
// <i> 是否启用算法时间片？
#define __SYSCFG_ALGORITHMTIMESHARING    0
// <o> 时间片算法
// <i> 时间片 = f(tpl)，tpl为优先级。
// <i> 应在文本编辑界面中定义。
// <i> 示例：(256 - tpl)
#define SYSCFG_ALGORITHMTIMESHARING(tpl) (tpl)
// </e>

// <e> 自定义时间片
// <i> 是否启用自定义时间片？
#define __SYSCFG_CUSTOMTIMESHARING       0
// <o> 时间片数组
// <i> 从优先级0级开始，逐个写出各优先级的时间片并用逗号间隔。
// <i> 应在文本编辑界面中定义。
// <i> 示例（优先级分组为8级时）：80,70,60,50,40,30,20,10
#define SYSCFG_CUSTOMTIMESHARING         
// <o> 时间片最大值
// <i> 时间片最大值
#define SYSCFG_MAXTIMESHARING            255
// </e>

#if   __SYSCFG_GLOBALTIMESHARING == 1 && __SYSCFG_ALGORITHMTIMESHARING == 0 && __SYSCFG_CUSTOMTIMESHARING == 0
#define SYSCFG_TIMESHARINGMODE           0
#elif __SYSCFG_GLOBALTIMESHARING == 0 && __SYSCFG_ALGORITHMTIMESHARING == 1 && __SYSCFG_CUSTOMTIMESHARING == 0
#define SYSCFG_TIMESHARINGMODE           1
#elif __SYSCFG_GLOBALTIMESHARING == 0 && __SYSCFG_ALGORITHMTIMESHARING == 0 && __SYSCFG_CUSTOMTIMESHARING == 1
#define SYSCFG_TIMESHARINGMODE           2
#elif __SYSCFG_GLOBALTIMESHARING == 0 && __SYSCFG_ALGORITHMTIMESHARING == 0 && __SYSCFG_CUSTOMTIMESHARING == 0
#error 时间片模式未定义！
#else
#error 时间片模式重定义！
#endif

// </h>

// <o> 用户任务总数
// <i> 仅指用户任务，不包括系统任务，数量不限。
// <i> 此项参数应大于等于实际的数量，但不可小于。大了只会多占用一些内存，小了会导致某些任务运行异常。
#define SYSCFG_USERTASKTOTAL             25

// <o> 用户定时中断总数
// <i> 取值范围：<0-64>
// <i> 用户创建的定时中断任务/钩子总数。
// <i> 此项参数应等于实际的数量，既不能大于也不能小于。不过您无需担心会出错，因为只要与实际不符，编译器就会报错。
#define SYSCFG_USERTIMINTTOTAL           5
#if SYSCFG_USERTIMINTTOTAL > 64
#error 非法的设置值！
#endif

// <o> 用户定时查询总数
// <i> 取值范围：<0-64>
// <i> 用户创建的定时查询任务/钩子总数。
// <i> 此项参数应等于实际的数量，既不能大于也不能小于。不过您无需担心会出错，因为只要与实际不符，编译器就会报错。
#define SYSCFG_USERTIMQRYTOTAL           5
#if SYSCFG_USERTIMQRYTOTAL > 64
#error 非法的设置值！
#endif

// <o> 任务名称最大长度
// <i> 取值范围：<8-255>
// <i> 任务名称应尽量简短，不可过长，因为它会对总的flash和内存占用有着一定的影响。
#define SYSCFG_TASKNAMEMAXLEN            16
#if SYSCFG_TASKNAMEMAXLEN < 8 || SYSCFG_TASKNAMEMAXLEN > 255
#error 非法的设置值！
#endif

// </h>
///////////////////////////////////////////////////////////////////////////////
// <h> 钩子函数设置
// <i> 钩子函数设置

// <q> 滴答钩子
// <i> 是否启用滴答钩子？
#define SYSCFG_TICKHOOK                  1

// <q> 空闲钩子
// <i> 是否启用空闲钩子？
#define SYSCFG_IDLEHOOK                  1

// </h>
///////////////////////////////////////////////////////////////////////////////
// <h> 软件定时器设置
// <i> 软件定时器设置

// <o> 延时定时器位数
// <8=> 8位 <16=> 16位 <32=> 32位 <64=> 64位
// <i> 延时定时器位数
#define SYSCFG_DELAYBITS                 32

// <o> 定时中断定时器位数
// <8=> 8位 <16=> 16位 <32=> 32位 <64=> 64位
// <i> 定时中断定时器位数
#define SYSCFG_TIMINTBITS                32

// <o> 定时查询定时器位数
// <8=> 8位 <16=> 16位 <32=> 32位 <64=> 64位
// <i> 定时查询定时器位数
#define SYSCFG_TIMQRYBITS                32

// </h>
///////////////////////////////////////////////////////////////////////////////
// <h> 线程通信设置
// <i> 线程通信设置

// <e> 私信
// <i> 是否启用私信？
#define SYSCFG_DIRMSG                    1
// <o> 私信创建模式
// <0=> 性能创建模式 <1=> 智能创建模式
// <i> 私信创建模式：性能创建模式、智能创建模式。Cortex-M内核，仅支持智能创建模式。
// <i> 性能创建模式：内存占用少，发送私信效率高；需使用预处理指令相配合，详情请参阅API相关说明和示例。
// <i> 智能创建模式：内存占用多，发送私信效率低；对于8051、80251内核，直接声明和创建任务即可。对于Cortex-M内核，需使用预处理指令相配合，详情请参阅API相关说明和示例。
#define SYSCFG_DIRMSGMODE                0
// </e>

// <q> 消息邮箱
// <i> 是否启用消息邮箱？
#define SYSCFG_MAILBOX                   1

// <q> 消息队列
// <i> 是否启用消息队列？
#define SYSCFG_MSGQUEUE                  1

// <q> 事件标志组
// <i> 是否启用事件标志组？
#define SYSCFG_FLAGGROUP                 1

// </h>
///////////////////////////////////////////////////////////////////////////////
// <h> 杂项设置
// <i> 杂项设置

// <o> 计数信号量位数
// <8=> 8位 <16=> 16位 <32=> 32位 <64=> 64位
// <i> 计数信号量位数
#define SYSCFG_SEMAPHOREBITS             32

// <q> 用户动态内存分配
// <i> 您在任务中是否使用动态内存分配？包括进程内存分配和线程内存分配。
#define SYSCFG_DYNMEMMGE                 1

// <e> 软件RTC
// <i> 是否启用软件RTC？
#define SYSCFG_SOFTRTC                   1

// <h> 生产日期

// <o> 年
// <2023=> 2023 <2024=> 2024 <2025=> 2025 <2026=> 2026 <2027=> 2027 <2028=> 2028 <2029=> 2029
// <2030=> 2030 <2031=> 2031 <2032=> 2032 <2033=> 2033 <2034=> 2034 <2035=> 2035 <2036=> 2036 <2037=> 2037 <2038=> 2038 <2039=> 2039
// <2040=> 2040 <2041=> 2041 <2042=> 2042 <2043=> 2043 <2044=> 2044 <2045=> 2045 <2046=> 2046 <2047=> 2047 <2048=> 2048 <2049=> 2049
// <2050=> 2050 <2051=> 2051 <2052=> 2052 <2053=> 2053 <2054=> 2054 <2055=> 2055 <2056=> 2056 <2057=> 2057 <2058=> 2058 <2059=> 2059
// <2060=> 2060 <2061=> 2061 <2062=> 2062 <2063=> 2063 <2064=> 2064 <2065=> 2065 <2066=> 2066 <2067=> 2067 <2068=> 2068 <2069=> 2069
// <2070=> 2070 <2071=> 2071 <2072=> 2072 <2073=> 2073 <2074=> 2074 <2075=> 2075 <2076=> 2076 <2077=> 2077 <2078=> 2078 <2079=> 2079
// <2080=> 2080 <2081=> 2081 <2082=> 2082 <2083=> 2083 <2084=> 2084 <2085=> 2085 <2086=> 2086 <2087=> 2087 <2088=> 2088 <2089=> 2089
// <2090=> 2090 <2091=> 2091 <2092=> 2092 <2093=> 2093 <2094=> 2094 <2095=> 2095 <2096=> 2096 <2097=> 2097 <2098=> 2098 <2099=> 2099
#define __SYSCFG_YEAR                    2023

// <o> 月
// <1=> 1 <2=> 2 <3=> 3 <4=> 4 <5=> 5 <6=> 6 <7=> 7 <8=> 8 <9=> 9 <10=> 10 <11=> 11 <12=> 12
#define __SYSCFG_MONTH                   3

// <o> 日
// <1=> 1 <2=> 2 <3=> 3 <4=> 4 <5=> 5 <6=> 6 <7=> 7 <8=> 8 <9=> 9 <10=> 10
// <11=> 11 <12=> 12 <13=> 13 <14=> 14 <15=> 15 <16=> 16 <17=> 17 <18=> 18 <19=> 19 <20=> 20
// <21=> 21 <22=> 22 <23=> 23 <24=> 24 <25=> 25 <26=> 26 <27=> 27 <28=> 28 <29=> 29 <30=> 30 <31=> 31
#define __SYSCFG_DATE                    7

// <o> 周
// <1=> 一 <2=> 二 <3=> 三 <4=> 四 <5=> 五 <6=> 六 <7=> 日
#define __SYSCFG_WEEK                    2

#define SYSCFG_MANUFACTUREDATE           __SYSCFG_YEAR, __SYSCFG_MONTH, __SYSCFG_DATE, 0, 0, 0, __SYSCFG_WEEK

// </h>
// </e>
// </h>
///////////////////////////////////////////////////////////////////////////////
// <h> 高级参数设置
// <i> 高级参数设置

// <o> 内核空操作
// <1=> 1个空操作 <2=> 2个空操作 <3=> 3个空操作 <4=> 4个空操作
// <5=> 5个空操作 <6=> 6个空操作 <7=> 7个空操作 <8=> 8个空操作
// <i> 定义用于系统内核中确保硬件执行时序的等待周期，一般情况下，2~4个空操作即可。
#define SYSCFG_NOPxX                     2

// </h>
///////////////////////////////////////////////////////////////////////////////

                //*** <<< end of configuration section >>> ***//

///////////////////////////////////////////////////////////////////////////////

#endif
